iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Software Development

Laravel專案練習-寶可夢管理系統系列 第 27

Day27 寶可夢專案-Docker練習- 容器創建、數據持久化、docker內部網路初探

  • 分享至 

  • xImage
  •  

前面一篇文帳講了一些關於docker的一些基本概念,這裡我想談談創建容器的方法:

創建容器指令

docker run --name my_laravel_container -v /Users/liweide/laravel/pokemon:/var -p 8080:8080 laravel
  1. docker run:

    這是 Docker 的命令,用於運行一個容器。

  2. -name my_laravel_container:

    使用 --name 選項來為你的容器命名,這裡命名為 my_laravel_container。

  3. v /Users/liweide/laravel/pokemon:/var:

    這是一個 volume 映射。 -v 選項允許你將主機上的目錄(在這裡是 /Users/liweide/laravel/pokemon)映射到容器內的目錄(在這裡是 /var)。

    • 什麼是volume?
      • volume為docker中一種數據持久化的方式。

        為了不讓我們的容器刪除或創建新的容器後,所做的更變消失,docker提供了幾種方法:

        使用Volume

        這種方式比較像是創建一個共享目錄,然後讓所有綁定的容器及主機可以供想裡面的內容,所以如果容器存了任何資料是存到這個目錄裡。

        • 建立 Volume

          使用 docker volume create 命令來建立一個新的 Volume。

          他會預設存在**/var/lib/docker/volumes/ 目錄下**

          
          docker volume create my_volume
          
          

          綁定 Volume

          要將 Volume 綁定到容器,可以使用以下命令:

          
          docker run -v my_volume:/path/in/container my_image
          
          

          移除 Volume

          不需要的 Volume 可以使用 docker volume rm 進行刪除:

          
          docker volume rm my_volume
          
          

        使用 Bind Mount

        綁定至 Filesystem

        Bind Mount 可以直接映射宿主機的文件或目錄到容器內,這個映射有點像是直接同步了你主機及容器對應的目錄,所以你容器做的任何修改他是直接反應到主機上。

        
        docker run -v /host/path:/container/path my_image
        
        
        • Bind Mount 及 Volume指令在使用上的差異

          所以他run指令的差別在於。你給他的目錄,如果他給的是主機的某個目錄他就是用bind Mount,如果給的是你創建volume的目錄的位置他就使用volume去做資料的持久化。

        • 使用Bind Mount 及 Volume的不同時機比較

          使用 Volume 的時機

          當你需要數據持久化並在多個容器間共享時,Volume 是最佳選擇。

          使用 Bind Mount 的時機

          如果需要直接訪問宿主機的文件系統,或者希望在開發中快速反映本地更改,則 Bind Mount 是更好的選項。

        這裡其實還有Tmpfs Mount,但我沒使用過所以就不多說。

  4. p 8000:8080:

    這是一個端口映射。 -p 選項允許你將容器的端口映射到主機的端口。在這裡,主機的8000port會對應到容器的8080

    • 為什麼容器需要自己的port號及ip?

      我自己一開始在使用的一個疑問,後來以我自己的理解是,我覺得是為了達到隔離的效果。

      • 隔離

        這個隔離我覺得算是docker一個一個很重要的概念,就是容器跟容器之間不會互相影響,外部也不會直接訪問到容器。

        • 隔離的目的:

          透過隔離的機制當我們想要測試專案在創建各種容器的環境讓運行時,就可以確保不受外部因素干擾。

        • 內部網路

          • 有時候容器跟容器之間也是需要溝通,比如你或許想隔離php7.4跟php8.2的環境,但你可能會需要和nginx的容器做溝通(比如請求近來需要透過nginx轉發)
          • 這時候docker 有提供一些內部的network來讓容器之間溝通
          • docker內部網路
            • 預設網路模式(bridge)
              • 當你啟動一個容器,Docker 會自動將其連接到一個預設的橋接網路。在這個模式下,容器有自己的私有 IP 地址,且可以透過 Docker 宿主機與外部世界互動。容器之間也可以互相溝通。
              • 其實簡單來說他就跟我們一般在使用網路很像,透過域名解析出ip還有對應的port來進行網路連線。
              • 只是這種模式下容器是無法直接與外部溝通,要透過連線到主機然後才能連線過來。
              • 優點
                • 隔離性:容器在其自己的網路命名空間內運行,與宿主機和其他容器有一定程度的隔離。
                • 靈活性:可以設定端口映射,控制外部如何訪問容器的服務。
                • 容器間通訊:容器之間可以在同一個橋接網路中互相溝通。
              • 缺點
                • 性能:由於多了一層網路層隔離,可能會有些許的性能損失。

                  當外部請求要訪問此Web服務時,請求首先到達Docker宿主機,然後Docker需要透過其網路橋接將這些請求轉發到正確的容器。
                  但這個延遲老實說我還沒有足夠的經驗體會不到。

                • 設定複雜性:可能需要設定端口映射和其他網路設定。

            • 主機模式(Host mode)
              • 工作原理
                當 Docker 容器以主機模式運行時,它將直接使用宿主機的網路命名空間。這意味著容器的所有網路活動都會直接在宿主機上進行,而不會有任何隔離。
              • 優點
                1. 性能:因為沒有額外的網路層隔離,所以容器的網路性能在這種模式下可能會更好,同上面提到的少了主機跟容器之間的內網溝通,但實際情況會差多少我沒有經驗。
                2. 簡單性:不需要設定端口映射,因為容器直接使用宿主機的端口。
              • 缺點
                1. 安全性:容器不再在其自己的網路命名空間中,這可能會導致安全風險。

                  比如:

                  如果有人攻擊你某個容器,整個主機跟容器都會受影響,但如果是在bridge網路連接下,你攻擊某一個容器,假設在沒使用mount等目錄共享的前提下,主機受到的影響可能比較沒這麼大。

                2. 不夠靈活:因為容器使用宿主機的端口,所以可能會出現端口衝突的問題。

              • 由於容器直接使用宿主機的網路,所以不需要 p 這種端口映射指令。
            這裡其實還有很多網路模式但我覺得實務經驗不夠多,我就不多提,我的目的就是對docker有個初步理解。

      小結語

      docker實在是非常多的細節可以研究,自己探究下去才發現水很深,我目前理解到這樣就花了不少時間,我自己覺得後續實務上真的有用到再進一步去研究吧。


上一篇
Day26:寶可夢專案-Docker練習-基本概念
下一篇
Day28:寶可夢專案-Docker練習-使用docker-compose創建容器
系列文
Laravel專案練習-寶可夢管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言